package ClassicalSortingAlgorithm;

import java.util.Arrays;

/**
 * @BelongsProject: LeetCode
 * @BelongsPackage: ClassicalSortingAlgorithm
 * @Author: song
 * @CreateTime: 2022-09-22  03:32
 * @Description: 稳定性 ：不稳定
 * 时间复杂度 ：最佳：O(nlogn)， 最差：O(nlogn)，平均：O(nlogn)
 * 空间复杂度 ：O(nlogn)
 * @Version: 1.0
 */

public class quickSort {

    public static int partition(int[] array,int low, int high){
        // 取最后一个元素作为中心元素
        int pivot = array[high];
        // 定义指向比中心元素大的指针，首先指向第一个元素
        int pointer = low;
        for (int i = low; i < high ; i++) {
            // 将比中心元素小的元素和指针指向的元素交换位置
            // 如果第一个元素比中心元素小，这里就是自己和自己交换位置，指针和索引都向下一位移动
            // 如果元素比中心元素大，索引向下移动，指针指向这个较大的元素，直到找到比中心元素小的元素，并交换位置，指针向下移动
            if (array[i] <= pivot){
                int temp = array[i];
                array[i] = array[pointer];
                array[pointer] = temp;
                pointer++;
            }
        }
        int temp = array[pointer];
        array[pointer] = array[high];
        array[high] = temp;
        return pointer;
    }
    public static void quickSort(int[] array,int low, int high){
        if (low < high){
            // 划分左右子数组位置；
            int position = partition(array,low,high);
            // 左子数组递归调用
            quickSort(array,low,position -1);
            // 右子数组递归调用
            quickSort(array,position+1,high);
        }
    }

    public static void main(String[] args) {
        int[] nums = {9,14,3,4,2,56,42,31};
        quickSort(nums,0, nums.length - 1);
        System.out.println("排序后的结果");
        System.out.println(Arrays.toString(nums));
    }
}
